package pfc.etsii.ull.es.server.pluggins;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Map;
import java.util.ServiceLoader;

import plugin.PluginInterface;

import java.util.HashMap;

public class PluginsUtils {
	
	private static final String EXTENSION_JAR = ".jar";
	private static final String DIRECTORIO_PLUGINS = "plugins/";
	private static final String PAQUETE = "plugin";
	
	private Map<String, PluginInterface> listaPlugins = new HashMap<String, PluginInterface>();
	
	public void loadPlugins () {
		
		File directorioPlugins = new File (DIRECTORIO_PLUGINS);
		
		if (directorioPlugins.exists() && directorioPlugins.isDirectory()) {
			File[] listFiles = directorioPlugins.listFiles(new FilenameFilter() {
				
				@Override
				public boolean accept(File file, String nameFile) {
					 return nameFile.endsWith(EXTENSION_JAR);
				}
				
			});
			
			for (File file : listFiles) {
				String nombrePlugins = fixNombre(file.getName());
				PluginInterface plugin = obtenerInstanciaPlugins(nombrePlugins, file.getAbsolutePath());
				if (plugin != null)
					listaPlugins.put(plugin.getName(), plugin);
				
			}
			
		}
		
	}
	
	String fixNombre (String nombre) {
		return nombre.replace(EXTENSION_JAR, "");
		
	}


	public PluginInterface obtenerInstanciaPlugins (String nombrePlugins, String ruta) {
		 try {
            // Se obtiene el ClassLoader y su metodo addURL()
            URLClassLoader classLoader = ((URLClassLoader) ClassLoader
                    .getSystemClassLoader());
            Method metodoAdd = URLClassLoader.class.getDeclaredMethod("addURL",
                    new Class[] { URL.class });
            metodoAdd.setAccessible(true);

            // La URL del jar que queremos anadir
            URL url = new URL("file://" + ruta);

            // Se invoca al metodo addURL pasando esa url del jar
            metodoAdd.invoke(classLoader, new Object[] { url });
            
            
            Class pluginsClass = Class.forName(PAQUETE + "." + nombrePlugins);
            PluginInterface newInstance = (PluginInterface) pluginsClass.newInstance();
            System.out.println("PLUGINS:: Cargado el plugins : " + newInstance.getName());
            return newInstance;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
					
	}

	
	public PluginInterface search (String nombre) {
		if (listaPlugins.containsKey(nombre))
			return listaPlugins.get(nombre);
		else
			return null;
		
	}

}
